﻿using EFDataModel;
using EFDataModel.Enums;
using System.Linq;

namespace ContactMvc4TB.Helpers.RightsManagement
{
    /// <summary>
    /// Testen ob der Aktuelle user auch das Recht besitzt, sich den entsprechenden Inhalt anzeigen zu lassen.
    /// </summary>
    public class WebRights
    {
        #region Static
        /// <summary>
        /// Gibt eine Instanz des WebUserRights zurück
        /// </summary>
        public static WebRights Right()
        {
            return new WebRights();
        }
        #endregion

        #region Properties
        /// <summary>
        /// Der aktuelle User
        /// </summary>
        private EFUser CurrentUser { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Private Konstruktor für die WebUserRights, welche nur über die Statische Funktion initialisiert werden kann.
        /// </summary>
        private WebRights()
        {
            //Prüfen ob der User eingeloggt ist.
            if (CurrentSession.IsUserLoggedIn())
            {
                CurrentUser = CurrentSession.GetCurrentUser();
            }
        }
        #endregion

        #region public functions
        /// <summary>
        /// Prüft ob der aktuelle User das Recht hat was übergeben wird.
        /// Das Überprüfen der Rechte muss beim Erstellen der Links durchgeführt werden sowie im CustomAuthorizeAttribute für 
        /// das Prüfen der jeweiligen Controllerrechte, das diese Aktionen dann auch nicht ausgeführt werden können.
        /// </summary>
        /// <param name="userRight">Das Recht was überprüft werden soll</param>
        /// <returns>TRUE->Aktueller Benutzer hat das Recht | FALSE->Aktuelle benutzer hat das Recht NICHT</returns>
        public bool Check(EUserRights userRight)
        {
            //Wenn CurrentUser noch null ist, dann ist der aktuelle User nicht eingeloggt
            if (CurrentUser != null)
            {
                //Wenn es sich um einen Superuser handelt, dieser darf alles.
                if (CurrentUser.IsSuperUser())
                {
                    return true;
                }

                //Der Admin darf alles, bis auf das Anlegen neuer Eingabefelder, das darf nur der SuperUser
                if (userRight != EUserRights.CreateDynamicDataTypes && CurrentUser.IsAdmin())
                {
                    return true;
                }

                //Das Recht Prüfen und zurück gegeben oder der User das Recht hat oder nicht.
                if (CurrentUser.GetUserRights().Where(p => p.EUserRight == userRight).Count() > 0)
                {
                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// Prüfen ob es sich um einen Administrator handelt der eingeloggt ist.
        /// </summary>
        /// <returns>TRUE->IsAdmin | FALSE->Kein Admin</returns>
        public bool IsAdmin()
        {
            //Prüfen ob der aktuelle User eingeloggt ist und Admin ist.
            if (CurrentUser != null && CurrentUser.IsAdminOrSuperUser())
            {
                return true;
            }

            return false;
        }
        #endregion

        #region Private Functions

        #endregion
    }
}